/**
 * CLASSE ListagemClientes
 *
 * Esta classe contem a implementacao do acesso ao arquivo CSV de clientes e a implementacao
 * das operacoes de consulta e insercao no cadastro de clientes. Enfim, todas as operacoes
 * relativas ao conjunto de clientes do sistema estao implementadas aqui.
 */

//-------------------------------------------------------------------
// I M P O R T A C A O   D E   C L A S S E S   D A   A P I   J A V A
//-------------------------------------------------------------------

import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Vector;

/**
 * Inicio da especificacao da classe.
 */
public class ListagemClientes {

//------------------------------------------------------
// M E T O D O S
//------------------------------------------------------

	/**
	 * METODO incluirCliente
	 *		Adiciona um novo cliente ao cadastro. Os dados desse cliente devem ser passados ao
	 * metodo dentro de um objeto da classe Cliente.
	 */
	public void incluirCliente(Cliente c) {
		try {
		
			FileWriter fw = new FileWriter("clientes.csv", true);
			BufferedWriter arq = new BufferedWriter(fw);
			
			// Grava os dados dos clientes, incluindo uma linha no final do arquivo.
			arq.write(c.codigo + ";" +
						  c.nome + ";" +
						  c.endereco + ";" +
						  c.telefone + ";" + 
						  c.email);
			arq.newLine();
			arq.close();
		} catch(IOException e) {
			System.out.println("Erro ao tentar gravar no arquivo \"clientes.csv\".");
		} 
	} // Fim do metodo "incluirCliente"

	/**
	 * METODO analisaLinha
	 *		Cria um objeto da classe Cliente contendo os dados do cliente contidos em uma linha do arquivo
	 * CSV de clientes, passada no parametro como um String.
	 */
	public Cliente analisaLinha(String linha) {
		String[] dados = linha.split(";");
		Cliente c = new Cliente();
		c.codigo = Integer.parseInt(dados[0].trim());
		c.nome = dados[1].trim();
		c.endereco = dados[2].trim();
		c.telefone = dados[3].trim();
		c.email = dados[4].trim();
		return c;
	} // Fim do metodo "analisaLinha"
	
	/**
	 * METODO consultaPorCodigo
	 *		Procura no cadastro de clientes por um cliente que tenha o codigo informado no parametro.
	 * O metodo devolve os dados do cliente encontrado dentro de um objeto da classe Cliente. Caso
	 * nao seja encontrado um cliente com o codigo informado, o metodo retornara o valor "null".
	 */
	public Cliente consultaPorCodigo(int codigo) {
		try {
			// Abre o arquivo para leitura.
			FileReader fr = new FileReader("clientes.csv");
			BufferedReader arq = new BufferedReader(fr);
			
			// Le o arquivo, linha a linha
			String linha = arq.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					String[] dados = linha.split(";");
					Cliente c = analisaLinha(linha);
					if(c.codigo == codigo) {
						arq.close();
						return c;
					}
				}
				linha = arq.readLine();	
			} 
			
			arq.close();
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de clientes (\"clientes.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler as linhas do arquivo \"clientes.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 78.
	
		return null;
	} // Fim do metodo "consultaPorCodigo"
	
	/**
	 * METODO consultaPorNome
	 *		Procura no cadastro de clientes por todos os clientes que possuem em seus nomes o String
	 * informado no parametro. Como resposta, o metodo devolve um vetor de objetos da classe Cliente
	 * contendo os dados dos clientes encontrados.
	 */
	public Cliente[] consultaPorNome(String nome) {
		Vector<Cliente> result = new Vector<Cliente>();
		try {
		
			// Abre o arquivo para leitura.
			FileReader fr = new FileReader("clientes.csv");
			BufferedReader arq = new BufferedReader(fr);
			
			// Le o arquivo, linha a linha
			String linha = arq.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					String[] dados = linha.split(";");
					Cliente c = analisaLinha(linha);
					if(c.nome.contains(nome)) {
						result.add(c);
					}
				}
				linha = arq.readLine();	
			} 
			
			arq.close();
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de clientes (\"clientes.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler as linhas do arquivo \"clientes.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 115.
		
		return result.toArray(new Cliente[0]);
	} // Fim do metodo "consultaPorNome"
	
	/**
	 * METODO alterarCliente
	 *		Altera os dados de um cliente no arquivo CSV. Os dados do cliente a ser alterado sao passados
	 * no objeto da classe Cliente informado no parametro.
	 */
	public void alterarCliente(Cliente cMod) {
		try {
			// Abre o arquivo para leitura.
			File dadosArqR = new File("clientes.csv");
			FileReader fr = new FileReader(dadosArqR);
			BufferedReader arqr = new BufferedReader(fr);
			
			// Abre um arquivo temporario para gravacao.
			File dadosArqW = new File("clientes_tmp.csv");
			FileWriter fw = new FileWriter(dadosArqW);
			BufferedWriter arqw = new BufferedWriter(fw);
			
			// Regrava o arquivo de clientes, gravando as alteracoes efetuadas no cliente informado
			// no novo arquivo.
			String linha = arqr.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					String[] dados = linha.split(";");
					Cliente cArq = analisaLinha(linha);
					
					if(cMod.codigo == cArq.codigo) {
						arqw.write(cMod.codigo + ";" +
						  cMod.nome + ";" +
						  cMod.endereco + ";" +
						  cMod.telefone + ";" + 
						  cMod.email);
					} else {
						arqw.write(cArq.codigo + ";" +
						  cArq.nome + ";" +
						  cArq.endereco + ";" +
						  cArq.telefone + ";" + 
						  cArq.email);
					}
					arqw.newLine();
				}
				linha = arqr.readLine();	
			} // Fim da estrutura while iniciada na linha 162
			
			arqr.close();
			arqw.close();
			
			// Apaga o antigo arquivo de clientes
			dadosArqR.delete();
			
			// Renomeia o arquivo temporario para o nome correto do arquivo de clientes.
			dadosArqW.renameTo(dadosArqR);
			
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de clientes (\"clientes.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler ou gravar no arquivo \"clientes.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 150.
		
	} // Fim do metodo "alterarCliente"
	
} // Fim da classe "ListagemClientes"
